supercool

Transformer Hardware Friendly Accelerator_3

    人工智能杂谈

Colab Google

Colab介绍

Colab = “python版”Google doc + 免费GPU

  • Jupyter Notebook : 在Colab中,python代码的执行是基于.ipynb文件,也就是Jupyter Notebook格式的python文件。这种笔记本文件与普通.py文件的区别是可以分块执行代码并立刻得到输出,同时也可以很方便地添加注释,这种互动式操作十分适合一些轻量的任务。
  • 代码执行程序 : 代码执行程序就是Colab在云端的”服务器”。简单来说,我们先在笔记本写好需要运行的代码,连接到代码执行程序,然后Colab会在云端执行代码,最后把结果传回浏览器。
  • 实例空间 : 连接到代码执行程序后,Colab需要为其分配实例空间(Instance),可以简单理解为运行笔记本而创建的”虚拟机”,其中包含了执行ipynb文件时的默认配置、环境变量、自带的库等等。
  • 会话 : 当笔记本连接到代码执行程序并分配到实例空间后,就成为了一个会话(Session),用户能开启的回话数量是有限的

Colab工作流程

  1. 将工程文件上传到Google drive的Colab Notebook文件夹

  2. 笔记本界面
    Colab窗口

    • 标题:笔记本的名称
    • 代码块:分块执行的代码
    • 文件浏览:Colab为笔记本分配的实例空间
    • 代码执行程序:用于执行笔记本程序的服务器
    • 代码段:常用的代码段,比如装载云端硬盘
    • 命令面板:常用的命令,比如查找/替换
    • 终端:文件浏览下的终端(非常卡,不建议使用)
  3. 连接代码执行程序
    连接到代码执行程序并分配实例空间,此时可以看到消耗的RAM和磁盘

    • RAM:虚拟机运行内存,更大内存意味着更大的算力
    • 磁盘:虚拟机文件的储存空间
  4. 设置笔记本的运行时类型
    运行:->代码执行程序->更改运行时类型即可->更改为GPU
    断开:->代码执行程序->断开连接并删除运行时。

  5. colab加载文件

    • colab里加载自己的谷歌云盘
      1
      2
      from google.colab import drive
      drive.mount('/content/drive')
      加载成功以后(可以点一下刷新按钮)就可以看到云盘在实例空间中出现
      谷歌云盘默认的加载路径是”/content/drive/MyDrive”
      加载谷歌云盘
    • 数据集以压缩包形式上传到谷歌云盘,然后解压到Colab实例空间
      1
      2
      3
      4
      # 创建datasets文件夹,用来加载训练数据集
      !mkdir /content/datasets
      # 在当前目录下("/content")创建一个叫datasets的文件夹,并将"zhihu_colab"中的数据集解压到这个文件夹
      !tar -xvf "/content/drive/MyDrive/zhihu_colab/ROD-synROD.tar" -C "/content/datasets"
      加载数据集
    • 查看分到的GPU是什么
      1
      2
      3
      4
      5
      6
      gpu_info = !nvidia-smi
      gpu_info = '\n'.join(gpu_info)
      if gpu_info.find('failed') >= 0:
      print('Not connected to a GPU')
      else:
      print(gpu_info)
      如果是T4,可以一直反复地刷显卡,断开运行时后再连接,不断重复直到刷出P100为止。
      查看GPU
  6. 训练模型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    !python3 /content/drive/MyDrive/zhihu_colab/
    mldl_project/code/train_eval.py \
    # \ 是表示流式输入输出(前一个命令的输出作为后一个命令的输入)
    #--data_root 用于指定数据集的根目录
    --data_root /content/datasets/ROD-synROD \
    #--logdir 用于指定保持模型日志(checkpoint + tensorboard)的路径,注意一定要保存到云盘里
    --logdir /content/drive/MyDrive/ \
    #--resume 表示如果有checkpoint就加载checkpoint
    --resume \
    #tee 命令用于将输出保存到文件同时也打印到屏幕,-a表示add模式(如果文件已存在会添加而不是覆盖)
    | tee /content/drive/MyDrive/synRODtoROD.txt -a

如何让代码有“断点续传”的能力?

由于Colab随时有可能断开连接,在Colab上训练模型的代码必须要有可恢复性(能载入上一次训练的结果)。
以下是两个分别实现保存和加载checkpoint的函数(基于pytorch)。

  • 保存
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    def save_checkpoint(path: Text,
    epoch: int,
    modules: Union[nn.Module, Sequence[nn.Module]],
    optimizers: Union[opt.Optimizer, Sequence[opt.Optimizer]],
    safe_replacement: bool = True):
    """
    Save a checkpoint of the current state of the >training, so it can >be resumed.
    This checkpointing function assumes that there are no >learning >rate schedulers or gradient scalers for >automatic
    mixed precision.
    :param path:
    Path for your checkpoint file
    :param epoch:
    Current (completed) epoch
    :param modules:
    nn.Module containing the model or a list of nn.>Module objects
    :param optimizers:
    Optimizer or list of optimizers
    :param safe_replacement:
    Keep old checkpoint until the new one has been >completed
    :return:
    """
    # This function can be called both as
    # save_checkpoint('/my/checkpoint/path.pth', my_epoch, >my_module, >my_opt)
    # or
    # save_checkpoint('/my/checkpoint/path.pth', my_epoch, >>[my_module1, my_module2], [my_opt1, my_opt2])
    if isinstance(modules, nn.Module):
    modules = [modules]
    if isinstance(optimizers, opt.Optimizer):
    optimizers = [optimizers]

    # Data dictionary to be saved
    data = {
    'epoch': epoch,
    # Current time (UNIX timestamp)
    'time': time.time(),
    # State dict for all the modules
    'modules': [m.state_dict() for m in modules],
    # State dict for all the optimizers
    'optimizers': [o.state_dict() for o in optimizers]
    }

    # Safe replacement of old checkpoint
    temp_file = None
    if os.path.exists(path) and safe_replacement:
    # There's an old checkpoint. Rename it!
    temp_file = path + '.old'
    os.rename(path, temp_file)

    # Save the new checkpoint
    with open(path, 'wb') as fp:
    torch.save(data, fp)
    # Flush and sync the FS
    fp.flush()
    os.fsync(fp.fileno())

    # Remove the old checkpoint
    if temp_file is not None:
    os.unlink(path + '.old')
  • 加载
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    def load_checkpoint(path: Text,
    default_epoch: int,
    modules: Union[nn.Module, Sequence[nn.Module]],
    optimizers: Union[opt.Optimizer, Sequence[opt.Optimizer]],
    verbose: bool = True):
    """
    Try to load a checkpoint to resume the training.
    :param path:
    Path for your checkpoint file
    :param default_epoch:
    Initial value for "epoch" (in case there are not >snapshots)
    :param modules:
    nn.Module containing the model or a list of nn.>Module objects. >They are assumed to stay on the >same device
    :param optimizers:
    Optimizer or list of optimizers
    :param verbose:
    Verbose mode
    :return:
    Next epoch
    """
    if isinstance(modules, nn.Module):
    modules = [modules]
    if isinstance(optimizers, opt.Optimizer):
    optimizers = [optimizers]

    # If there's a checkpoint
    if os.path.exists(path):
    # Load data
    data = torch.load(path, map_location=next(modules[0].parameters()).device)

    # Inform the user that we are loading the >checkpoint
    if verbose:
    print(f"Loaded checkpoint saved at {datetime.fromtimestamp(data['time']).strftime('%Y-%m-%d >%H:%M:%S')}. "
    f"Resuming from epoch {data['epoch']}")

    # Load state for all the modules
    for i, m in enumerate(modules):
    modules[i].load_state_dict(data['modules'][i])

    # Load state for all the optimizers
    for i, o in enumerate(optimizers):
    optimizers[i].load_state_dict(data['optimizers'][i])

    # Next epoch
    return data['epoch'] + 1
    else:
    return default_epoch
  • 在主程序train.py正式开始训练前,添加下面的语句:
    1
    2
    3
    # args.resume是命令行输入的参数,用于指示要不要加载上次训练的结果
    if args.resume:
    first_epoch = load_checkpoint(checkpoint_path, first_epoch, net_list, optims_list)
  • 在每个epoch训练结束后,保存checkpoint:
    1
    2
    3
    4
    # Save checkpoint
    # net_list是需要保存的网络列表,optims_list是需要保存的优化器列表
    # 如果代码里用到了scheduler,那也要保存scheduler的列表。
    save_checkpoint(checkpoint_path, epoch, net_list, optims_list)

VIVADO

vivado HLS

C to RTL
整体功能

  1. 创建工程
    资料 Vivado HLS入门
    新建工程
  • 加载C/C++文件
    空着不加载
  • 加载test bench文件
    空着不加载
    “test bench”(测试台)是一个用于模拟设计输入和观察输出的程序或文件,用于模拟输入信号并验证设计输出是否符合预期。测试台文件包含测试输入的生成、时钟信号的生成和其他必要的控制信号的生成;还包含对设计输出的监视和分析的代码。通过在测试台中模拟各种输入情况,设计工程师可以验证电路的行为,并进行调试和改进。
  1. 选择硬件芯片型号
    选择硬件
    创建完成:Source 包括我们的设计源文件,Test Bench是我们的仿真文件。
  2. Add Source File
  • 命名xxx.cpp
    Add Source file
  • run C Synthesis
    验证C源代码:点击project>run c simulation 点击ok
  1. Add TestBench File
  • 命名xxx_tb.cpp,save file
    Add TestBench File
  • run C Simulation**
    验证C源代码:点击project>run c simulation 点击ok
    C Simulation
  • run C Synthesis
    验证C源代码:点击solution>run c synthesis 点击ok
    C Synthesis
  1. run C/RTL co-simulation Dialog**
  • RTL验证:点击solution>run c/rtl cosimulation>ok
    C/RTL co-simulation
  1. run Export RTL
  • 输出RTL文件,创建IP
  • choose verilog/VHDL
    Export RTL
  1. Open Wave Viewer
    Wave Viewer
    Wave Viewer

vivado

VITIS

vitis HLS

vitis HLS 与 vivado HLS 本质上相同,只是换了一个UI界面的感觉
Vivado-hls使用实例-详细教程

作用

  • 输入:Tesbench,C/C++源代码和Directives
  • 输出:IP Catalog,DSP和SysGe

注意

  • 一个工程只能有一个顶层函数用于综和,这个顶层函数下面的子函数也是可以被综合的,会生成相应的VHDL和Verilog代码,所以,C综合后的RTL代码结构通常是跟原始C描述的结构是一致的,除非是子函数功能很简单,所需要的逻辑量很小。
  • 并不是所有的C/C++都可以被综合,动态内存分配和涉及到操作系统层面的操作不可以被综合。

流程

  • 用户创建一个设计 C、C++ 或 SystemC 源代码,以及一个C的测试平台。通过 Vivado HLS Synthesis 运行设计,生成 RTL 设计,代码可以是 Verilog,也可以是 VHDL。
  • 有了 RTL 后,随即可以执行设计的 Verilog 或 VHDL 仿真,或使用工具的C封装器技术创建 SystemC 版本。然后可以进行System C架构级仿真,进一步根据之前创建的 C 测试平台,验证设计的架构行为和功能。
  • 设计固化后,就可以通过 Vivado 设计套件的物理实现流程来运行设计,将设计编程到器件上,在硬件中运行和/或使用IP封装器将设计转为可重用的IP。

vitis

LINUX

ubantu

ubantu系统安装到硬盘

vitis下载 —-在这里很坑⚠️🥹

  1. 首先是ubantu的安装,一开始是想安装在移动硬盘,但是后来安装的时候试了很多遍,死活识别不了移动硬盘,遂自能安装在自己的电脑硬盘中。
  2. vitis不支持ubantu最新版本,只支持2018.04.1~2018.04.4,于是在我三次尝试云下载,一次下载完整个安装包,花了总共600G流量,💰130人民币,总共四五次失败,且出现同一个报错之后。我终于上网,啊,看到了另一个老哥也是这个样子,just是因为ubantu版本不!支!持!(他的网站怎么就不能说明呢,会死吗?!没事的,我情绪很稳定🙂)
  3. 接下来就是安装步骤
    在ubantu2018中不能像最新版本一样,右击就出现作为程序运行
    以下为安装步骤:
    • 解压tar.gz压缩包
    • 点进去,右击空白处,”打开位于此处的终端”
    • 输入 “sudo ./xsetup”
    • 接下来就是正常安装步骤
  4. 打开软件
  • 导航到settings64.sh文件处,空白处右击打开终端
  • 输入 “source settings64.sh”
  • 继续输入 “vitis/vitis HLS/vivado”
  1. 环境配置
  • 输入:”sudo gedit .bashrc”
  • 在文件的最后一行加入:
    • source /安装目录/Vivado/2021.2/settings64.sh
    • source /安装目录/Vitis/2021.2/settings64.sh
    • source /安装目录/Vitis_HLS/2021.2/settings64.sh
  • 保存文件,然后输入”source .bashrc”
  1. 报错出现
    “the configuration area at’/home/ls/.xilinx/vitis/2023.1’could not be created.please choose a writable location using the ‘-configuration’ command line option.”

路径

  • 绝对路径:路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
  • 相对路径:路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。

文件与目录管理命令

1
2
3
4
5
6
7
8
ls (英文全拼:list files): 列出目录及文件名
cd 英文全拼:change directory):切换目录 -------------cd .. 退回上一级目录
pwd (英文全拼:print work directory):显示目前的目录
mkdir (英文全拼:make directory):创建一个新的目录
rmdir (英文全拼:remove directory):删除一个空的目录
cp (英文全拼:copy file): 复制文件或目录
rm (英文全拼:remove): 删除文件或目录
mv (英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
本文阅读量: 本站总访问量: 本站访客数: